const formatTime = (date, type = 1) => {
	// 1:年月日时分秒 | 2 年月日
	const year = date.getFullYear()
	const month = date.getMonth() + 1
	const day = date.getDate()
	const hour = date.getHours()
	const minute = date.getMinutes()
	const second = date.getSeconds()

	if (type == 1) {
		return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(
			':')
	} else {
		return [year, month, day].map(formatNumber).join('/')
	}



}

const $h = {
	//除法函数，用来得到精确的除法结果
	//说明：javascript的除法结果会有误差，在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
	//调用：$h.Div(arg1,arg2)
	//返回值：arg1除以arg2的精确结果
	Div: function (arg1, arg2) {
		arg1 = parseFloat(arg1);
		arg2 = parseFloat(arg2);
		var t1 = 0,
			t2 = 0,
			r1, r2;
		try {
			t1 = arg1.toString().split(".")[1].length;
		} catch (e) { }
		try {
			t2 = arg2.toString().split(".")[1].length;
		} catch (e) { }
		r1 = Number(arg1.toString().replace(".", ""));
		r2 = Number(arg2.toString().replace(".", ""));
		return this.Mul(r1 / r2, Math.pow(10, t2 - t1));
	},
	//加法函数，用来得到精确的加法结果
	//说明：javascript的加法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
	//调用：$h.Add(arg1,arg2)
	//返回值：arg1加上arg2的精确结果
	Add: function (arg1, arg2) {
		arg2 = parseFloat(arg2);
		var r1, r2, m;
		try {
			r1 = arg1.toString().split(".")[1].length
		} catch (e) {
			r1 = 0
		}
		try {
			r2 = arg2.toString().split(".")[1].length
		} catch (e) {
			r2 = 0
		}
		m = Math.pow(100, Math.max(r1, r2));
		return (this.Mul(arg1, m) + this.Mul(arg2, m)) / m;
	},
	//减法函数，用来得到精确的减法结果
	//说明：javascript的加法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
	//调用：$h.Sub(arg1,arg2)
	//返回值：arg1减去arg2的精确结果
	Sub: function (arg1, arg2) {
		arg1 = parseFloat(arg1);
		arg2 = parseFloat(arg2);
		var r1, r2, m, n;
		try {
			r1 = arg1.toString().split(".")[1].length
		} catch (e) {
			r1 = 0
		}
		try {
			r2 = arg2.toString().split(".")[1].length
		} catch (e) {
			r2 = 0
		}
		m = Math.pow(10, Math.max(r1, r2));
		//动态控制精度长度
		n = (r1 >= r2) ? r1 : r2;
		return ((this.Mul(arg1, m) - this.Mul(arg2, m)) / m).toFixed(n);
	},
	//乘法函数，用来得到精确的乘法结果
	//说明：javascript的乘法结果会有误差，在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
	//调用：$h.Mul(arg1,arg2)
	//返回值：arg1乘以arg2的精确结果
	Mul: function (arg1, arg2) {
		arg1 = parseFloat(arg1);
		arg2 = parseFloat(arg2);
		var m = 0,
			s1 = arg1.toString(),
			s2 = arg2.toString();
		try {
			m += s1.split(".")[1].length
		} catch (e) { }
		try {
			m += s2.split(".")[1].length
		} catch (e) { }
		return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
	},
}

const formatNumber = n => {
	n = n.toString()
	return n[1] ? n : '0' + n
}

/**
 * 处理服务器扫码带进来的参数
 * @param string param 扫码携带参数
 * @param string k 整体分割符 默认为：&
 * @param string p 单个分隔符 默认为：=
 * @return object
 * 
 */
const getUrlParams = (param, k, p) => {
	if (typeof param != 'string') return {};
	k = k ? k : '&'; //整体参数分隔符
	p = p ? p : '='; //单个参数分隔符
	var value = {};
	if (param.indexOf(k) !== -1) {
		param = param.split(k);
		for (var val in param) {
			if (param[val].indexOf(p) !== -1) {
				var item = param[val].split(p);
				value[item[0]] = item[1];
			}
		}
	} else if (param.indexOf(p) !== -1) {
		var item = param.split(p);
		value[item[0]] = item[1];
	} else {
		return param;
	}
	return value;
}

const wxgetUserInfo = function () {
	console.log("wxgetUserInfo")
	return new Promise((resolve, reject) => {
		// #ifdef MP-ALIPAY
		uni.getAuthUserInfo({
			lang: 'zh_CN',
			success(res) {
				resolve(res);
			},
			fail(res) {
				reject(res);
			}
		})
		// #endif
		// #ifndef MP-ALIPAY
		uni.getUserInfo({
			lang: 'zh_CN',
			success(res) {
				resolve(res);
			},
			fail(res) {
				reject(res);
			}
		})
		// #endif
	});
}

// 检查登录，登录状态为真 && 未到过期时间
const checkLogin = function () {
	if (uni.getStorageSync('app_key')) {
		try {
			let data = uni.getStorageSync('app_key')
			// console.log(JSON.parse(JSON.parse(uni.getStorageSync('app_key'))),999999999999999999 )
			// console.log(data,999999999999999999)
			let res = data.token ? true : false;
			let newTime = Math.round(new Date() / 1000);
			if (data.token && data.seconds >= newTime) {
				console.log('进入')
				getApp().globalData.isLog = true;
				getApp().globalData.token = data.token;
				getApp().globalData.seconds = data.seconds;
				return true
			} else {
				return false
			}
		} catch (error) {
			console.log(error)
		}

	} else {
		return false
	}
}

const logout = function () {
	getApp().globalData.token = '';
	getApp().globalData.seconds = '';
	getApp().globalData.isLog = false;
	uni.removeStorageSync('app_key');
}

const chekWxLogin = function () {
	
	return new Promise((resolve, reject) => {
		uni.getStorage({
			key: 'app_key',
			success(res) {
				console.log(res, 88888888888)
				if (res.data && res.data.token) {
					return resolve({
						data: res.data,
						isLog: true
					});
				} else {
					getCodeLogin((result) => {
						// console.log(result)
						return resolve({
							data: result,
							isLog: false
						});
					})
				}
			},
			fail() {
				return resolve({
					isLog: false
				});
			}
		})

		// if (checkLogin()) {
		// 	// return resolve({
		// 	// 	data:JSON.parse(res.data),
		// 	// 	isLog:true
		// 	// });
		// 	getCodeLogin((result) => {
		// 		// wxgetUserInfo().then(userInfo => {
		// 		// 	userInfo.code = result.code;
		// 		// 	return resolve({
		// 		// 		userInfo: userInfo,
		// 		// 		isLog: true
		// 		// 	});
		// 		// }).catch(res => {
		// 		// 	return reject(res);
		// 		// })
		// 		return resolve({
		// 			data:result,
		// 			isLog:true
		// 		});
		// 	})
		// } else {
		// 	// return resolve({
		// 	// 	data:JSON.parse(res.data),
		// 	// 	isLog:false
		// 	// });
		// 	getCodeLogin((result) => {
		// 		// wxgetUserInfo().then(userInfo => {
		// 		// 	userInfo.code = result.code;
		// 		// 	return resolve({
		// 		// 		userInfo: userInfo,
		// 		// 		isLog: false
		// 		// 	});
		// 		// }).catch(res => {
		// 		// 	return reject(res);
		// 		// })
		// 		return resolve({
		// 			data:result,
		// 			isLog:false
		// 		});
		// 	})
		// }
		// uni.getStorage({
		// 	key: 'app_key',
		// 	success(res) {
		// 		if (res.data) {
		// 			if (checkLogin()) {
		// 				// return resolve({
		// 				// 	data:JSON.parse(res.data),
		// 				// 	isLog:true
		// 				// });
		// 				getCodeLogin((result) => {
		// 					wxgetUserInfo().then(userInfo => {
		// 						userInfo.code = result.code;
		// 						return resolve({
		// 							userInfo: userInfo,
		// 							isLog: true
		// 						});
		// 					}).catch(res => {
		// 						return reject(res);
		// 					})
		// 				})
		// 			} else {
		// 				// return resolve({
		// 				// 	data:JSON.parse(res.data),
		// 				// 	isLog:false
		// 				// });
		// 				getCodeLogin((result) => {
		// 					wxgetUserInfo().then(userInfo => {
		// 						userInfo.code = result.code;
		// 						return resolve({
		// 							userInfo: userInfo,
		// 							isLog: false
		// 						});
		// 					}).catch(res => {
		// 						return reject(res);
		// 					})
		// 				})
		// 			}

		// 		} else {
		// 			return reject({
		// 				data: {},
		// 				isLog: false
		// 			});
		// 		}


		// 	},
		// 	fail(res) {
		// 		return reject({
		// 			data: {},
		// 			isLog: false
		// 		});
		// 	}
		// })
	})
}

const getCodeLogin = function (successFn) {
	// #ifndef H5
	// console.log(1)+
	// #ifndef MP-XHS
	uni.login({
		success(res) {
			console.log(res)
			successFn(res)
		}
	})

	// #endif

	// #ifdef MP-XHS
	xhs.login({
		success(res) {
			console.log(res)
			successFn(res)
		}
	})
	// #endif
	// #endif
	// #ifdef H5 
	successFn("")
	// #endif

	// #ifdef MP-WEIXIN
	wx.login({
		success(res) {
			successFn(res)
		}
	})
	// #endif
}

/*
 * 合并数组
 */
const SplitArray = function (list, sp) {
	if (typeof list != 'object') return [];
	if (sp === undefined) sp = [];
	for (var i = 0; i < list.length; i++) {
		sp.push(list[i]);
	}
	return sp;
}

/**
 * opt  object | string
 * to_url object | string
 * 例:
 * this.Tips('/pages/test/test'); 跳转不提示
 * this.Tips({title:'提示'},'/pages/test/test'); 提示并跳转
 * this.Tips({title:'提示'},{tab:1,url:'/pages/index/index'}); 提示并跳转值table上
 * tab=1 一定时间后跳转至 table上
 * tab=2 一定时间后跳转至非 table上
 * tab=3 一定时间后返回上页面
 * tab=4 关闭所有页面跳转至非table上
 * tab=5 关闭当前页面跳转至table上
 */
const Tips = function (opt, to_url) {
	if (typeof opt == 'string') {
		to_url = opt;
		opt = {};
	}
	var title = opt.title || '',
		icon = opt.icon || 'none',
		endtime = opt.endtime || 2000;
	if (title) uni.showToast({
		title: title,
		icon: icon,
		duration: endtime
	})
	if (to_url != undefined) {
		if (typeof to_url == 'object') {
			var tab = to_url.tab || 1,
				url = to_url.url || '';
			switch (tab) {
				case 1:
					//一定时间后跳转至 table
					setTimeout(function () {
						uni.switchTab({
							url: url
						})
					}, endtime);
					break;
				case 2:
					//跳转至非table页面
					setTimeout(function () {
						uni.navigateTo({
							url: url,
						})
					}, endtime);
					break;
				case 3:
					//返回上页面
					setTimeout(function () {
						uni.navigateBack({
							delta: parseInt(url),
						})
					}, endtime);
					break;
				case 4:
					//关闭当前所有页面跳转至非table页面
					setTimeout(function () {
						uni.reLaunch({
							url: url,
						})
					}, endtime);
					break;
				case 5:
					//关闭当前页面跳转至非table页面
					setTimeout(function () {
						uni.redirectTo({
							url: url,
						})
					}, endtime);
					break;
			}

		} else if (typeof to_url == 'function') {
			setTimeout(function () {
				to_url && to_url();
			}, endtime);
		} else {
			//没有提示时跳转不延迟
			setTimeout(function () {
				uni.navigateTo({
					url: to_url,
				})
			}, title ? endtime : 0);
		}
	}
}
/*
 * 单图上传
 * @param object opt
 * @param callable successCallback 成功执行方法 data 
 * @param callable errorCallback 失败执行方法 
 */
const uploadImageOne = function (opt, successCallback, errorCallback) {
	if (typeof opt === 'string') {
		var url = opt;
		opt = {};
		opt.url = url;
	}
	var count = opt.count || 1,
		sizeType = opt.sizeType || ['compressed'],
		sourceType = opt.sourceType || ['album', 'camera'],
		is_load = opt.is_load || true,
		uploadUrl = opt.url || '',
		inputName = opt.name || 'pics';
	uni.chooseImage({
		count: count, //最多可以选择的图片总数  
		sizeType: sizeType, // 可以指定是原图还是压缩图，默认二者都有  
		sourceType: sourceType, // 可以指定来源是相册还是相机，默认二者都有  
		success: function (res) {
			//启动上传等待中...  
			uni.showLoading({
				title: '图片上传中',
			});
			uni.uploadFile({
				url: getApp().globalData.url + '/api/' + uploadUrl,
				filePath: res.tempFilePaths[0],
				name: inputName,
				formData: {
					'filename': inputName
				},
				header: {
					"Content-Type": "multipart/form-data",
					Authorization: 'Bearer ' + getApp().globalData.token
				},
				success: function (res) {
					uni.hideLoading();
					if (res.statusCode == 403) {
						Tips({
							title: res.data
						});
					} else {
						var data = res.data ? JSON.parse(res.data) : {};
						if (data.status == 200) {
							successCallback && successCallback(data)
						} else {
							errorCallback && errorCallback(data);
							Tips({
								title: data.msg
							});
						}
					}
				},
				fail: function (res) {
					uni.hideLoading();
					Tips({
						title: '上传图片失败'
					});
				}
			})
		}
	})
}

/**
 * 移除数组中的某个数组并组成新的数组返回
 * @param array array 需要移除的数组
 * @param int index 需要移除的数组的键值
 * @param string | int 值
 * @return array
 * 
 */
const ArrayRemove = (array, index, value) => {
	const valueArray = [];
	if (array instanceof Array) {
		for (let i = 0; i < array.length; i++) {
			if (typeof index == 'number' && array[index] != i) {
				valueArray.push(array[i]);
			} else if (typeof index == 'string' && array[i][index] != value) {
				valueArray.push(array[i]);
			}
		}
	}
	return valueArray;
}
/**
 * 生成海报获取文字
 * @param string text 为传入的文本
 * @param int num 为单行显示的字节长度
 * @return array 
 */
const textByteLength = (text, num) => {
	let strLength = 0;
	let rows = 1;
	let str = 0;
	let arr = [];
	for (let j = 0; j < text.length; j++) {
		if (text.charCodeAt(j) > 255) {
			strLength += 2;
			if (strLength > rows * num) {
				strLength++;
				arr.push(text.slice(str, j));
				str = j;
				rows++;
			}
		} else {
			strLength++;
			if (strLength > rows * num) {
				arr.push(text.slice(str, j));
				str = j;
				rows++;
			}
		}
	}
	arr.push(text.slice(str, text.length));
	return [strLength, arr, rows] //  [处理文字的总字节长度，每行显示内容的数组，行数]
}

/**
 * 获取分享海报
 * @param array arr2 海报素材
 * @param string store_name 素材文字
 * @param string price 价格
 * @param function successFn 回调函数
 * 
 * 
 */
const PosterCanvas = (context, arr2, storeInfo, successFn) => {
	console.log("PosterCanvas", context, arr2, storeInfo)
	// uni.showLoading({ title: '海报生成中', mask: true });
	let store_name = storeInfo.store_name
	let nationalFlag = storeInfo.nationalFlag
	let ctx = context || uni.createCanvasContext('myCanvas');
	ctx.clearRect(0, 0, 0, 0);

	/**
	 * 只能获取合法域名下的图片信息,本地调试无法获取
	 * 
	 */
	uni.getImageInfo({
		src: arr2[0],
		success: function (res) {
			console.log(res)
			const WIDTH = res.width;
			const HEIGHT = res.height;
			ctx.setStrokeStyle("#FFFFFF"); // 添加背景色
			console.log('https://file.aavisa.com/zsvisa/9d8f2344b30d44aca15b2d143f5659ff_org.jfif')
			ctx.drawImage(arr2[0], 0, 0, WIDTH, HEIGHT); // 背景图     
			ctx.drawImage(arr2[1], 0, 0, WIDTH, (WIDTH * 3 / 4 + 20)); // 国家背景图  
			ctx.save();

			// let r = 100;
			// let d = r * 2;
			// let cx = WIDTH - 250;
			// let cy = 1000;
			// ctx.arc(cx + r, cy + r, r, 0, 2 * Math.PI);
			// ctx.clip();
			// ctx.drawImage(arr2[2], cx, cy, d, d); // 二维码
			// ctx.restore();
			// ctx.setFontSize(28);
			// ctx.fillText("长按识别二维码", WIDTH - 250, HEIGHT - 60);
			// 产品标题
			const CONTENT_ROW_LENGTH = 34;
			if (store_name.length > 35) {
				store_name = store_name.substring(0, 35) + '...'
			}
			let [contentLeng, contentArray, contentRows] = textByteLength(store_name,
				CONTENT_ROW_LENGTH);
			ctx.setFontSize(38);
			let contentHh = 40 * 1.5;
			for (let m = 0; m < contentArray.length; m++) {
				ctx.fillText(contentArray[m], 40, (WIDTH - 100) + contentHh * m);
			}

			// 产品名称添加下划线 
			ctx.fillRect(40, HEIGHT / 2 + 110, 660, 1)

			// ctx.fillRect(40, HEIGHT - 165, WIDTH / 2 + 50, 1) 

			// 有效期
			ctx.setFontSize(34);
			ctx.fillText(`${storeInfo.vias.limitTime}`, 60, HEIGHT / 2 + 200);
			ctx.setFontSize(28);
			ctx.fillText('有效期', 20 + (storeInfo.vias.limitTime.length / 2 * 25), HEIGHT / 2 + 250);
			// 停留时长
			ctx.setFontSize(34);
			ctx.fillText(`${storeInfo.vias.stayDay}`, 320, HEIGHT / 2 + 200);
			ctx.setFontSize(28);
			ctx.fillText('最长停留', 275 + (storeInfo.vias.stayDay.length / 2 * 25), HEIGHT / 2 + 250);
			//入境次数
			ctx.setFontSize(34);
			ctx.fillText(`${storeInfo.vias.enterCount}`, 580, HEIGHT / 2 + 200);
			ctx.setFontSize(28);
			ctx.fillText('入境次数', 535 + (storeInfo.vias.enterCount.length / 2 * 25), HEIGHT / 2 + 250);
			ctx.draw();

			let sr;
			sr = setTimeout(() => {
				clearTimeout(sr);
				//画布生成BUG要在延时执行
				uni.canvasToTempFilePath({
					canvasId: 'myCanvas',
					fileType: 'png',
					destWidth: WIDTH,
					destHeight: HEIGHT,
					success: function (res) {
						console.log("success", res)
						uni.hideLoading();

						successFn && successFn(res.tempFilePath);
					},
					fail(res) {
						uni.hideLoading();
						console.log("fail", res)
					}
				})
			}, 600);
		},
		fail: function (res) {
			uni.hideLoading();
			console.log(res)
			Tips({
				title: '无法获取图片信息'
			});
		}
	})
}

/**
 * 数字变动动画效果
 * @param float BaseNumber 原数字
 * @param float ChangeNumber 变动后的数字
 * @param object that 当前this
 * @param string name 变动字段名称
 * */
const AnimationNumber = (BaseNumber, ChangeNumber, that, name) => {
	var difference = $h.Sub(ChangeNumber, BaseNumber) //与原数字的差
	var absDifferent = Math.abs(difference) //差取绝对值
	var changeTimes = absDifferent < 6 ? absDifferent : 6 //最多变化6次
	var changeUnit = absDifferent < 6 ? 1 : Math.floor(difference / 6);
	// 依次变化
	for (var i = 0; i < changeTimes; i += 1) {
		// 使用闭包传入i值，用来判断是不是最后一次变化
		(function (i) {
			setTimeout(() => {
				that.setData({
					[name]: $h.Add(BaseNumber, changeUnit)
				})
				// 差值除以变化次数时，并不都是整除的，所以最后一步要精确设置新数字
				if (i == changeTimes - 1) {
					that.setData({
						[name]: $h.Add(BaseNumber, difference)
					})
				}
			}, 100 * (i + 1))
		})(i)
	}
}

/**
 * 数字变动动画效果
 * @param Array arr 原数组
 * @param string name 分组依据
 * */
const arrForGroup = (arr, name) => {
	let newList = {}
	arr.map((val) => {
		if (newList.hasOwnProperty(val[name])) {
			return newList[val[name]].push(val)
		} else {
			newList[val[name]] = new Array()
			return newList[val[name]].push(val)
		}
	})
	return newList
}


const is_weixin = () => {
	let res = false;
	// #ifdef H5
	var ua = navigator.userAgent.toLowerCase();
	if (ua.match(/MicroMessenger/i) == "micromessenger") {
		return res = true;
	}
	// #endif
	return res;
}


const handleClipboard = (text) => {
	// #ifdef MP-ALIPAY
	uni.setClipboardData({
		data: text,
		success: function () {
			console.log('success');
			// 复制成功提示;
			uni.showToast({
				title: '复制成功',
				icon: 'none'
			});
		}
	});
	// #endif

	// #ifdef MP-XHS
	xhs.setClipboardData({
		data: text,
		success: function () {
			console.log('success');
			// 复制成功提示;
			uni.showToast({
				title: '复制成功',
				icon: 'none'
			});
		}
	});
	// #endif

	// #ifdef H5  
	let oInput = document.createElement('input');
	oInput.value = text;
	document.body.appendChild(oInput);
	oInput.select(); // 选择对象;
	document.execCommand("Copy"); // 执行浏览器复制命令
	// 复制成功提示;
	uni.showToast({
		title: '复制成功',
		icon: 'none'
	});
	oInput.remove()
	// #endif 
}

const replaceURl = (url) => {
	// #ifdef H5  
	if (url.indexOf('https://vias2019.oss-cn-shenzhen.aliyuncs.com') > -1) {
		url = url.replace("https://vias2019.oss-cn-shenzhen.aliyuncs.com", "/app_viasImg")
	} else if (url.indexOf('http://photo.aavisa.com') > -1) {
		url = url.replace("http://photo.aavisa.com", "/app_photoImg")
	}

	if (process.env.NODE_ENV !== 'production') {
		if (url.indexOf('https://file.aavisa.com') > -1) {
			url = url.replace("https://file.aavisa.com", "/app_fileImg")
		}
	} else {
		if (url.indexOf('https://file.aavisa.com') > -1) {
			url = url.replace("https://file.aavisa.com/zsvisa", "/zsvisa")
		}
	}
	// #endif 

	return url
}

module.exports = {
	formatTime,
	$h,
	Tips,
	uploadImageOne,
	SplitArray,
	ArrayRemove,
	PosterCanvas,
	AnimationNumber,
	getUrlParams,
	chekWxLogin,
	getCodeLogin,
	checkLogin,
	wxgetUserInfo,
	arrForGroup,
	is_weixin,
	handleClipboard,

	replaceURl,
	logout
}
